package com.example.server.utils;

import net.coobird.thumbnailator.Thumbnails;
import org.springframework.web.multipart.MultipartFile;

import java.io.File;
import java.io.IOException;
import java.util.Arrays;
import java.util.List;

public class FileUploadUtil {
    // 允许的图片格式
    private static final List<String> ALLOWED_FORMATS = Arrays.asList("jpg", "jpeg", "png");
    private static final List<String> ALLOWED_MIME_TYPES = Arrays.asList("image/jpeg", "image/png");

    public static String saveImageFile(MultipartFile file, String folder, String fileName, String format) throws IOException {
        // 检查文件
        validateImageFile(file);
        // 定义根目录
        String uploadDir = "uploads/" + folder;
        File dir = new File(uploadDir);
        if (!dir.exists() && !dir.mkdirs()) {
            throw new IOException("无法创建文件目录：" + uploadDir);
        }
        String filePath = uploadDir + "/" + fileName + "." + format;
        // 使用 Thumbnailator 进行格式转换并保存
        Thumbnails.of(file.getInputStream())
                .outputFormat(format)
                .size(200, 200)
                .toFile(filePath);

        return filePath;
    }

    public static void validateImageFile(MultipartFile file) throws IOException {
        String originalFilename = file.getOriginalFilename();
        if (originalFilename == null || originalFilename.isEmpty()) {
            throw new IOException("文件名不能为空");
        }

        // 检查 MIME 类型
        String contentType = file.getContentType();
        if (contentType == null || !ALLOWED_MIME_TYPES.contains(contentType)) {
            throw new IOException("仅支持 JPG 和 PNG 格式的图片文件");
        }

        // 检查文件扩展名
        String originalExtension = getFileExtension(originalFilename).toLowerCase();
        if (!ALLOWED_FORMATS.contains(originalExtension)) {
            throw new IOException("不支持的文件格式: " + originalExtension);
        }

        // 检查文件头内容
        byte[] fileHeader = new byte[8];
        file.getInputStream().read(fileHeader);
        if (!isImageFileHeader(fileHeader)) {
            throw new IOException("文件内容不是有效的图片");
        }

        // 检查文件大小
        if (file.getSize() > 2 * 1024 * 1024) {
            throw new IOException("文件大小不能超过 2MB");
        }

    }

    //检查文件头是否为图片格式（JPEG/PNG）
    private static boolean isImageFileHeader(byte[] fileHeader) {
        return (fileHeader[0] == (byte) 0xFF && fileHeader[1] == (byte) 0xD8) ||   // JPEG
                (fileHeader[0] == (byte) 0x89 && fileHeader[1] == (byte) 0x50 &&
                        fileHeader[2] == (byte) 0x4E && fileHeader[3] == (byte) 0x47);      // PNG
    }

    //获取文件扩展名
    private static String getFileExtension(String fileName) {
        int dotIndex = fileName.lastIndexOf('.');
        return (dotIndex != -1) ? fileName.substring(dotIndex + 1) : "";
    }
}
